package com.cskaoyan.wordmemorize.controller.admin;

import com.cskaoyan.wordmemorize.common.result.Result;
import com.cskaoyan.wordmemorize.dto.admin.*;
import com.cskaoyan.wordmemorize.request.PageRequest;
import com.cskaoyan.wordmemorize.request.PermissionCommand;
import com.cskaoyan.wordmemorize.request.RoleCommand;
import com.cskaoyan.wordmemorize.request.RolePermissionCommand;
import com.cskaoyan.wordmemorize.service.RolePermissionService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/admin")
@Tag(name = "角色权限管理", description = "角色和权限管理相关接口")
public class RolePermissionController {

    @Autowired
    private RolePermissionService rolePermissionService;

    /**
     * 分页获取角色列表(后台账号权限管理-角色管理)
     *
     * @return 角色列表
     */
    @GetMapping("/role/list")
    @Operation(summary = "获取角色列表", description = "主要用于账号权限管理-角色管理")
    public Result<PageDTO<RoleDTO>> getRoleList(PageRequest pageRequest) {
        PageDTO<RoleDTO> pageDTO = rolePermissionService.getRoleList(pageRequest);
        return Result.ok(pageDTO);
    }

    /**
     * 获取角色权限树(后台账号权限管理-角色管理点击授权时返回的角色授权树)
     *
     * @param roleId 角色ID
     * @return 权限列表
     */
    @GetMapping("/{roleId}/permission/list")
    @Operation(summary = "获取角色权限树", description = "主要用于账号权限管理-角色管理")
    public Result<RolePermissionDTO> getRolePermissionList(@PathVariable Long roleId) {
        RolePermissionDTO rolePermissionDTO = rolePermissionService.getRolePermissionList(roleId);
        return Result.ok(rolePermissionDTO);
    }

    /**
     * 添加角色(后台账号权限管理-角色管理)
     *
     * @param command 角色信息
     * @return 新创建的角色信息
     */
    @PostMapping("/role")
    @Operation(summary = "添加角色", description = "主要用于账号权限管理-角色管理")
    public Result<RoleDTO> addRole(@RequestBody RoleCommand command) {
        // 添加角色并获取新角色ID
        Long roleId = rolePermissionService.addRole(command);

        // 创建角色DTO对象并返回
        RoleDTO roleDTO = new RoleDTO();
        roleDTO.setId(String.valueOf(roleId));
        roleDTO.setName(command.getName());
        roleDTO.setDescription(command.getDescription());

        return Result.ok(roleDTO);
    }


    /**
     * 更新角色(后台账号权限管理-角色管理)
     *
     * @param command 角色信息
     * @return 操作结果
     */
    @PutMapping("/role")
    @Operation(summary = "更新角色", description = "主要用于账号权限管理-角色管理")
    public Result<Void> updateRole(@RequestBody RoleCommand command) {
        rolePermissionService.updateRole(command);
        return Result.ok();
    }

    /**
     * 更新角色权限关系(后台账号权限管理-角色管理)
     *
     * @param command 角色权限信息
     * @return 操作结果
     */
    @PutMapping("/role/permission")
    @Operation(summary = "角色授权", description = "主要用于账号权限管理-角色管理")
    public Result<Void> updateRolePermission(@RequestBody RolePermissionCommand command) {
        rolePermissionService.updateRolePermission(command);
        return Result.ok();
    }

    /**
     * 删除角色(后台账号权限管理-角色管理)
     *
     * @param roleId 角色ID
     * @return 操作结果
     */
    @DeleteMapping("/role/{roleId}")
    @Operation(summary = "删除角色", description = "主要用于账号权限管理-角色管理")
    public Result<DeleteRoleOperateDTO> deleteRole(@PathVariable Long roleId) {
        DeleteRoleOperateDTO operateDTO = rolePermissionService.deleteRole(roleId);
        return Result.ok(operateDTO);
    }


    /**
     * 删除指定角色指定权限(后台账号权限管理-角色管理)
     *
     * @param roleId       角色ID
     * @param permissionId 权限ID
     * @return 操作结果
     */
    @DeleteMapping("/permission/{roleId}/{permissionId}")
    @Operation(summary = "删除角色权限", description = "主要用于账号权限管理-角色管理")
    public Result<DeleteRolePermissionOperateDTO> deleteRolePermission(@PathVariable Long roleId, @PathVariable Long permissionId) {
        DeleteRolePermissionOperateDTO deleteRolePermissionOperateDTO = rolePermissionService.deleteRolePermission(roleId, permissionId);
        return Result.ok(deleteRolePermissionOperateDTO);
    }

    /**
     * 获取权限树
     *
     * @return 权限树
     */
    @GetMapping("/permission/list")
    @Operation(summary = "获取权限树", description = "主要用于账号权限管理-权限管理")
    public Result<List<PermissionDTO>> getPermissions() {
        List<PermissionDTO> permissions = rolePermissionService.getPermissions();
        return Result.ok(permissions);
    }

    /**
     * 添加权限
     *
     * @param command 权限请求体
     * @return 成功结果
     */
    @PostMapping("/permission")
    @Operation(summary = "添加权限", description = "主要用于账号权限管理-权限管理")
    public Result<Void> savePermissions(@RequestBody PermissionCommand command) {
        rolePermissionService.savePermissions(command);
        return Result.ok();
    }

    /**
     * 更新权限
     *
     * @param command 权限请求体
     * @return 成功结果
     */
    @PutMapping("/permission")
    @Operation(summary = "更新权限", description = "主要用于账号权限管理-权限管理")
    public Result<Void> updatePermission(@RequestBody PermissionCommand command) {
        rolePermissionService.updatePermission(command);
        return Result.ok();
    }

    /**
     * 删除权限
     *
     * @param permissionId 权限ID
     * @return 删除操作日志
     */
    @DeleteMapping("/permission/{permissionId}")
    @Operation(summary = "删除权限", description = "主要用于账号权限管理-权限管理")
    public Result<DeletePermissionOperateDTO> deletePermission(@PathVariable Long permissionId) {
        DeletePermissionOperateDTO operateDTO = rolePermissionService.deletePermission(permissionId);
        return Result.ok(operateDTO);
    }
}
